#ifndef _ADC_ADC_APP_H_
#define _ADC_ADC_APP_H_

#include "main.h"
#include "UART/uart_app.h"
#include "adc.h"

/**
 ****************************************************************************************************
 * DONE 用户变量区
 ****************************************************************************************************
 */



#define ADC1_CHANNEL_CNT 4      //采样通道数
#define ADC1_CHANNEL_FRE 1     //采样次数


#define Voltage		3300.0 //设置Vref引脚参数电压值（如3300表示3300mV=3.300V） 后缀必须有“.0”以使之浮点运算

#define ADC_LOOP1_MARK	10 //【一级滤波的采集数据数量】可选比对数量10~200（推荐50）  数值较大反应越慢
#define ADC_LOOP2_MARK	10 //【二级滤波的采集数据数量】可选比对数量10~200（推荐10）

//-----------------------------------------------	

extern uint16_t ADC_DMA_Buf1[ADC1_CHANNEL_CNT*ADC1_CHANNEL_FRE];//水下传感器数据
extern uint16_t ADC_DMA_Buf2[ADC1_CHANNEL_CNT*ADC1_CHANNEL_FRE];//水上传感器数据
extern uint16_t ADC_DATA_BUFF1[ADC_LOOP1_MARK];
extern uint16_t ADC_DATA_BUFF2[ADC_LOOP2_MARK];

extern uint16_t ADC_Values1[ADC1_CHANNEL_CNT];
extern uint16_t ADC_Values2[ADC1_CHANNEL_CNT];

extern ADC_HandleTypeDef hadc1;

extern uint16_t ADC1_Channel_Number[]; // ADC1采样通道号
extern uint16_t ADC2_Channel_Number[]; // ADC2采样通道号	

/**
 ****************************************************************************************************
 * DONE 用户函数区
 ****************************************************************************************************
 */

/**
 * @if Eng
 * @brief Initializes DMA for ADC data transfer
 * @param hadc - Pointer to ADC handle structure
 * @result DMA is configured for ADC data transfers 
 * @else 
 * @brief 初始化ADC数据传输的DMA
 * @param hadc - 指向ADC句柄结构的指针
 * @result DMA被配置用于ADC数据传输 
 * @endif 
 */
void DMA_Init(ADC_HandleTypeDef *hadc);

/**
 * @if Eng
 * @brief Reads a single ADC channel value
 * @param hadc - Pointer to ADC handle structure
 * @param ch - ADC channel number to read 
 * @param ADC_SAMPLETIME - Sampling time setting for the ADC 
 * @return Raw ADC conversion result (12-bit value)
 * @else 
 * @brief 读取单个ADC通道值
 * @param hadc - 指向ADC句柄结构的指针
 * @param ch - 要读取的ADC通道号 
 * @param ADC_SAMPLETIME - ADC的采样时间设置 
 * @return ADC原始转换结果(12位值)
 * @endif 
 */
uint16_t ADC_Read(ADC_HandleTypeDef* hadc,uint16_t ch,uint16_t ADC_SAMPLETIME);

/**
 * @if Eng 
 * @brief Calculates moving average of ADC readings (method 1)
 * @param adc - Raw ADC value to add to the average
 * @return Smoothed ADC value (averaged)
 * @else
 * @brief 计算ADC读数的移动平均值(方法1)
 * @param adc - 要加入平均的原始ADC值
 * @return 平滑后的ADC值(平均后)
 * @endif 
 */
uint16_t ADCgetavg1(uint16_t adc);

/**
 * @if Eng 
 * @brief Calculates moving average of ADC readings (method 2)
 * @param adc - Raw ADC value to add to the average 
 * @return Smoothed ADC value (averaged)
 * @else 
 * @brief 计算ADC读数的移动平均值(方法2)
 * @param adc - 要加入平均的原始ADC值 
 * @return 平滑后的ADC值(平均后)
 * @endif 
 */
uint16_t ADCgetavg2(uint16_t adc);

/**
 * @if Eng 
 * @brief Converts ADC raw value to voltage
 * @param adc - Raw ADC value (12-bit)
 * @return Voltage in millivolts (mV)
 * @else
 * @brief 将ADC原始值转换为电压 
 * @param adc - 原始ADC值(12位)
 * @return 电压值(毫伏)
 * @endif 
 */
uint16_t ADC_to_Voltage(uint16_t adc);

/**
 * @if Eng 
 * @brief Reads multiple ADC channels 
 * @param hadc - Pointer to ADC handle structure
 * @param ADC_Channel_Number - Array of channel numbers to read
 * @param ADC_Values - Output array for ADC readings 
 * @result ADC_Values contains readings for all requested channels
 * @else
 * @brief 读取多个ADC通道 
 * @param hadc - 指向ADC句柄结构的指针 
 * @param ADC_Channel_Number - 要读取的通道号数组
 * @param ADC_Values - 存储ADC读数的输出数组
 * @result ADC_Values包含所有请求通道的读数 
 * @endif 
 */
void ADC_DATA_READ(ADC_HandleTypeDef* hadc,uint16_t *ADC_Channel_Number,uint16_t *ADC_Values);

#endif

